• 问题

    受检异常通过强制调用者通过catch处理异常情况,能够从一定程度上确保程序的可靠性。如果API设计时,抛出多个受检异常,那么调用方就必须使用多个catch进行相应的处理,或者将它们在throws出去,反而让调用方增加了负担。那么,在设计方法是否抛出异常的时候应该有哪些原则?

  • 问题

    1. 在设计方法抛出异常的时候,应该换位思考,如果自己是调用方使用你设计的API,处理你抛出的异常应该怎样处理?如果有明确的思路,就说明这个异常抛出来是合适的。也就是说,异常是API中不可避免的,并且一旦产生,调用方能够合理的处理,就说明抛出受检异常是合适的,一定要求这两个前提条件全部成立;

    2. “把调用具有受检异常的方法进行重构”的一种方法是,把这个抛出异常的方法分成两个方法,其中第一个方法返回一个boolean,表明状态测试,代表是否应该抛出异常,例如下面的示例代码:

      //Invocation with checked exception
      try {
           obj.action(args);
      } catch(TheCheckedException e) {
          // Handle exceptional condition
      }
      重构为:
      // Invocation with state-testing method and unchecked exception
      if (obj.actionPermitted(args))  { 
            obj.action(args);.
      } else {
             // Handle exceptional condition
      }
      

      上面的这种重构方式虽然代码调用更加复杂,但是让程序更有灵活性。但是,需要注意的时候,凡是涉及到状态更新和状态测试的时候,都需要考虑线程安全的问题

  • 结论

    由于受检异常,需要调用方必须做出处理,因此,在设计API的时候就需要着重去考虑所抛出的受检异常,是否真的是合理的,要站在调用方的角度去考虑。

results matching ""

    No results matching ""